#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

void read_childproc(int sig)
{
	int   status;
	pid_t id = waitpid(-1, &status, WNOHANG);    // 因为系统在有子进程结束时才调用，因此id不为0
	if(WIFEXITED(status))
	{
		printf("Removed proc id: %d \n", id);
		printf("Child send: %d \n", WEXITSTATUS(status));
	}
}

int main(int argc, char *argv[])
{
	pid_t  pid;
	struct sigaction act;
	sigemptyset(&act.sa_mask);
	act.sa_handler = read_childproc;
	act.sa_flags   = 0;
	sigaction(SIGCHLD, &act, 0);         // 注册系统函数

	pid=fork();
	if(pid==0)
	{
		puts("Hi! I'm child process");
		sleep(10);
		return 12;
	}
	else
	{
		printf("Child proc id: %d \n", pid);
		pid=fork();
		if(pid==0)
		{
			puts("Hi! I'm child process");
			sleep(10);
			exit(24);
		}
		else
		{
			int i;
			printf("Child proc id: %d \n", pid);
			for(i=0; i<5; i++)
			{
				puts("wait...");
				sleep(5);             //! 记住这里依然要等到，不然主进程可能先退出
			}
		}
	}
	return 0;
}
